import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

/**
 * @auther hewenhui
 * @see <a href="hetp://www.codingmaster.com> java </a>
 */

/*
我们这个类是为展示http请求的样子，说以应该是继承HttpServletRequest类，
使用里面的类方法来解析读取http的相关信息，并写入http响应的body部分返回给客户端


上面这个猜想是错误的，servlet已经帮我们解析好了http请求并创建了一个HttpServletRequest对象，
我们使用这个对象就可以了，不需要继承HttpServletRequest.
servlet只能够帮助我们解析特定格式的键值对，对于json格式的键值对，我们需要使用其他的第三方库jquery里面的jkson
* */
@WebServlet("/ShowRequest")
public class ShowRequest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //返回请求的方法
        String method = req.getMethod();
        System.out.println("method:"+method);

        //返回请求的url
        String requestURI = req.getRequestURI();
        System.out.println("requestURI:"+requestURI);

        //返回http请求的名称和版本
        String protocol = req.getProtocol();
        System.out.println("protocol:"+protocol);

        //返回application
        String contextPath = req.getContextPath();
        System.out.println("contextPath:"+contextPath);

        //返回包含在路径后的请求 URL 中的查询字符串。
        String queryString = req.getQueryString();
        System.out.println("queryString:"+queryString);

        //返回一个 String 对象的枚举，包含在该请求中包含的参数的名称。  所有键值对的key
        //这里会去重
        Enumeration<String> parameterNames = req.getParameterNames();
        while (parameterNames.hasMoreElements()){
            String parameter=parameterNames.nextElement();
            System.out.println(parameter);
        }
        //??枚举类型该怎么打印啊！

        //以字符串形式返回请求参数的值，或者如果参数不存在则返回null。 什么参数的值，真高级，把我整懵了都，不久就是键值对吗
        String parameter = req.getParameter("name");
        System.out.println("parameter:"+parameter);//因为key可能会重复，但是只这里只能返回一个值，也就是从哈希表里面查询到的第一个值

        //之所以可以返回一个字符串，是因为key唯一
        String[] parameterValues = req.getParameterValues("name");
        for(String str:parameterValues){
            System.out.println("parameterValues:"+str);
        }

        //包含所有的头名？头名还真不少
        Enumeration<String> headerNames = req.getHeaderNames();
        while(headerNames.hasMoreElements()){
            System.out.println("headerNames:"+headerNames.nextElement());
        }

        //以字符串形式返回指定的请求头的值。
        //http请求的结构：首行，请求头，空白行，body(Get方法的请求的body部分是空的)
        //返回指定请求头的值：请求头的内容也是键值对，此处指的就是键值对的key
        //熟悉合http结构
        String header = req.getHeader("Referer");
        System.out.println("Referer:"+header);

        String header2 = req.getHeader("Host");
        System.out.println("Host:"+header2);


        //返回请求主体中使用的字符编码的名称。
        String characterEncoding = req.getCharacterEncoding();
        System.out.println("characterEncoding:"+characterEncoding);

        //返回请求主体的 MIME 类型，如果不知道类型则返回 null。
        String contentType = req.getContentType();
        System.out.println("contentType:"+contentType);

        //以字节为单位返回请求主体的长度，并提供输入流，或者如果
        //长度未知则返回 -1。
        System.out.println(req.getContentLength());


        //用于读取请求的 body 内容. 返回一个 InputStream 对象。因为是InputStream对象所以可以直接输出
        System.out.println(req.getInputStream());



        /*
        如果是构造返回的字符串respbody，想要换换行
        resp.getWriter().write("respbody");需要在respbody里面添加<br>进行换行
        resp.getWriter().write("\n");也可以换行

        * <br>
        * */
    }
}
